﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _06继承与多态案例
{
    /// <summary>
    /// 武器基类
    /// </summary>
    class Weapon
    {
        //字段
        private string _name;//武器名称
        private int _magazineCapacity;//弹匣容量
        private int _ammoNumInMc;//当前弹匣中的弹药数量
        protected float _attackDis;//攻击距离
        protected float _fireRate;//射速
        protected int _totalAmmoNum = 15;//当前型号武器总弹药量
       
        //弹匣容量属性
        public int MagazineCapacity
        {
            get { return _magazineCapacity; }
            set { 
                if(value <=200)
                     _magazineCapacity = value;
            }
        }

        //当前弹匣中的弹药数量
        public int AmmoNumInMc
        {
            get { return _ammoNumInMc; }
            set { 
                if(value <= _magazineCapacity)
                    _ammoNumInMc = value;
            }
        }

        //开火
        public virtual void Fire() {
            //Console.WriteLine("基类的开火方法,不实现任何功能");
            //当前弹匣中的弹药数量减少
            if (_ammoNumInMc > 0)
            {
                _ammoNumInMc--;//当前弹匣中的子弹减少
                _totalAmmoNum--;
            }
                
            else
                Reload();
        }
        //更换弹匣
        public void Reload()
        {
            if(_totalAmmoNum > _magazineCapacity)
            {
                Console.WriteLine("更换弹匣");
                _ammoNumInMc = _magazineCapacity;
            }
            else
            {
                Console.WriteLine("将剩余的子弹都压入弹匣");
                _ammoNumInMc = _totalAmmoNum;
            }
           
        }

        //输出武器当前状态
        public virtual void PrintWeaponStatus()
        {
            Console.WriteLine("----------武器状态栏---------");
            Console.WriteLine("武器名称:{0}",_name);//私有字段可以在类内部直接使用
            Console.WriteLine("弹药/弹匣:{0}/{1}", _ammoNumInMc,_magazineCapacity);          
        }

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="name">武器名称</param>
        /// <param name="mc">弹匣容量</param>
        /// <param name="an">当前弹匣中的弹药数量</param>
        /// <param name="fireRate">射击速度</param>
        /// <param name="dis">攻击距离</param>
        public Weapon(string name, int mc, int an,float fireRate, float dis)
        {
            _name = name;//任何名字都可以使用
            MagazineCapacity = mc;//使用属性对赋值进行保护
            AmmoNumInMc = an;//使用属性对赋值进行保护
            _fireRate = fireRate;
            _attackDis = dis;
        }
    }
}
